from flask import Flask, redirect, url_for, request

# https://www.w3cschool.cn/flask/flask_quick_guide.html
app = Flask(__name__)

"""
这两个规则看起来类似，但在第二个规则中，使用尾部斜杠（/）。 
因此，它成为一个规范的URL。 
因此，使用 /python 或 /python/ 返回相同的输出。 
但是，如果是第一个规则， /flask/ 网址会产生 404未找到 页。
"""


@app.route('/flask')
def hello_flask():
    return 'Hello Flask'


@app.route('/python/')
def hello_python():
    return 'Hello Python'


# 传参

@app.route("/my_list")
def my_list():
    page = request.args.get('page', 1, type=int)
    return f"当前页面{page}"


@app.route('/')
def index():
    return 'Hello World ,hi Flask.从此从此'


# 这里，URL  /hello规则绑定到 hello_world（）函数。
# 因此，如果用户访问 http://localhost：8080/hello URL，
# hello_world（）函数的输出将在浏览器中呈现。

# 参数是字符串，所以如果用户访问 http://localhost：8080/hello/John，
# 则将显示 Hello John。
@app.route('/hello/<name>')
def hello_world(name):
    return f'hello {name}'


# 参数必须是数字，所以如果用户访问 http://localhost：8080/blog/123，
# 则将显示 Blog Number 123。
@app.route('/blog/<int:postID>')
def show_blog(postID):
    return 'Blog Number %d' % postID


def hi_world():
    return 'hi world'


app.add_url_rule('/hi', None, hi_world)


# 参数是浮点数，所以如果用户访问 http://localhost：8080/rev/4.1，
# 则将显示 Revision Number 4.1。
@app.route('/rev/<float:revNo>')
def revision(revNo):
    return 'Revision Number %f' % revNo


"""
Flask - URL构建
url_for（）函数对于动态构建特定函数的URL非常有用。 
该函数接受函数的名称作为第一个参数，以及一个或多个关键字参数，
每个参数对应于URL的可变部分。
以下脚本演示了如何使用 url_for（）函数。
上述脚本有一个函数 user（name），它接受来自URL的参数的值。

User（）函数检查接收的参数是否与\'admin\'匹配。 如果匹配，则使用 url_for（）将应用程序重定向到 hello_admin（）函数，否则将 hello_guest 参数作为guest参数。

保存上面的代码并从Python shell运行。
"""


@app.route('/admin')
def hello_admin():
    return 'Hello Admin'


@app.route('/guest/<guest>')
def hello_guest(guest):
    return 'Hello %s as Guest' % guest


@app.route('/user/<name>')
def hello_user(name):
    if name == 'admin':
        return redirect(url_for('hello_admin'))
    else:
        return redirect(url_for('hello_guest', guest=name))


"""
为了演示在URL路由中使用 POST 方法，首先让我们创建一个HTML表单，并使用 POST 方法将表单数据发送到URL。
"""


@app.route('/success/<name>')
def success(name):
    return 'welcome %s' % name


@app.route('/login/', methods=['POST', 'GET'])
def login():
    if request.method == 'POST':
        user = request.form['nm']
        return redirect(url_for('success', name=user))
    else:
        user = request.args.get('nm')
        return redirect(url_for('success', name=user))


if __name__ == '__main__':
    app.run('0.0.0.0', '5000', debug=True)
